package serviceImpl;

import Dao.CarDao;
import pojo.Car;
import pojo.Record;
import pojo.User;
import service.AdminMenu;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 管理员菜单类
 * 作用：根据需要调用功能类
 */
public class  AdminMenuImpl implements AdminMenu {

    Scanner sc;
    AdminServiceImpl adminImpl;
    UserServiceImpl userImpl;
    User user;
    public AdminMenuImpl() {
        sc=new Scanner(System.in);
        adminImpl = new AdminServiceImpl();
        userImpl = new UserServiceImpl();
    }

    /**
     * 进入管理员菜单
     */
    @Override
    public void start() {
        System.out.println("================");
        System.out.println("欢迎访问二嗨租车");
        System.out.println("================");
        System.out.println("1.登录 2.退出");
        int choice=sc.nextInt();
        switch (choice){
            case 1:
                //登录
                sign_in();
                break;
            case 2:
                //退出至选择客户端
                new Choice().choice();
                break;
        }
    }

    /**
     * 管理员登录
     */
    @Override
    public void sign_in() {
        System.out.println("======登录======>>>>");
        System.out.println("用户名：");
        //输入用户名
        String name=sc.next();
        System.out.println("密码：");
        //输入密码
        String password=sc.next();
        //调用功能类中的登录方法 返回登登录的用户
        User admin=userImpl.sign_in(name,password);
        if(admin==null){
            System.out.println("用户名或密码错误");
            sign_in();
            return;
        }else if (!admin.isAdmin()){
            System.out.println("请用普通用户客户端登录");
            new Choice().choice();
        }else if (admin.isAdmin()){
            //进入主菜单
            menu(admin);
        }
    }

    /**
     * 管理员主菜单
     * @param admin 用于判断登录的用户
     */
    @Override
    public void menu(User admin) {
        user=admin;
        System.out.println("==========================");
        System.out.println("欢迎"+admin.getName());
        System.out.println("==========================");
        showAllCar(user);
        System.out.println();
        System.out.println("输入0退出");
        System.out.println("输入1+汽车编号 查看指定汽车");
        System.out.println("输入2+1 按价格降序排序 2+2 按价格升序排序");
        System.out.println("输入3+类型编号 按类型搜索");
        System.out.println("输入4+品牌编号 按品牌搜索");
        System.out.println("输入5  查看全部汽车");
        System.out.println("输入6  添加汽车");
        System.out.println("输入7+汽车编号 修改汽车");
        System.out.println("输入8 查看租车记录");
        String choice=sc.next();
        if (choice.length()>2){
            String[] str = choice.split("\\+");
            switch (str[0]){
                case "1":
                    findCar(str[1]);
                    break;
                case "2":
                    sort(str[1],user);
                    break;
                case "3":
                    type(str[1],user);
                    break;
                case "4":
                    brand(str[1],user);
                    break;
                case "7":
                    updateCar(str[1]);
                    break;
                default:
                    System.out.println("输入有误");
                    rest();
                    break;
            }

        }else{
            switch (choice){
                case "0":
                    new Choice().choice();
                    break;
                case "5":
                    showAllCar2(user);
                    break;
                case "6":
                    addCar();
                    break;
                case "8":
                    carRent(user);
                    break;
                default:
                    System.out.println("输入有误");
                    rest();
                    break;
            }
        }
    }

    /**
     * 根据id查找测含量
     * @param id 需要查找车的id
     */
    @Override
    public void findCar(String id) {
        //获取符合id的车辆
        Car car=adminImpl.findCar(Integer.parseInt(id));
        //判断是否为空
        if (car==null){
            System.out.println("没有找到此辆车");
            rest();
        }else{
            System.out.println("编号\t汽车名称\t备注\t\t品牌\t\t类型\t\t\t价格\t\t是否可租");
            System.out.println(car+"  "+(car.isRent()?"是":"否"));
        }

        rest();
    }

    /**
     * 根据菜单选择排序
     * @param choice 决定升序降序  1.降序  2.升序
     * @param user 触发排序功能的用户
     */
    @Override
    public void sort(String choice, User user) {
        //获取排序后车辆的集合
        ArrayList<Car> cars=userImpl.sort(choice);
        //判断是否为空
        if (cars==null){
            System.out.println("输入错误");
            rest();
        }
        //打印车辆信息
        showCar(cars);
        rest();
    }

    /**
     * 根据类型查找
     * @param type 查找的类型
     * @param user 触发查找的用户
     */
    @Override
    public void type(String type, User user) {
        //获取符合类型车辆的集合
        ArrayList<Car> cars = userImpl.type(type);
        //打印车辆集合
        showCar(cars);
        rest();
    }
    /**
     * 根据品牌查找
     * @param brand 查找的品牌
     * @param user 触发查找的用户
     */
    @Override
    public void brand(String brand, User user) {
        //获取符合品牌车辆的集合
        ArrayList<Car> cars = userImpl.brand(brand);
        //打印车辆集合
        showCar(cars);
        rest();
    }

    /**
     * 用于查找完成后显示车辆
     * @param cars 符合条件的车的集合
     */
    public void showCar(ArrayList<Car> cars) {
        //循环遍历传入车的集合
        for (Car car : cars) {
            System.out.println(car+"  "+(car.isRent()?"是":"否"));
        }
    }

    /**
     * 查看全部的车
     * 用于主菜单的显示
     * @param user 触发用户
     */
    @Override
    public void showAllCar(User user) {
        //调用方法打印全部车辆
        //用于菜单前的打印  不需要返回上一层
        userImpl.showAllCar(user);
    }

    /**
     * 菜单中查看全部车的功能
     * @param user 触发用户
     */
    public void showAllCar2(User user){
        //调用方法打印全部车辆
        //用于菜单前的打印  需要返回上一层
        userImpl.showAllCar(user);
        rest();
    }

    /**
     * 添加车辆
     */
    @Override
    public void addCar() {
        System.out.println("=============================");
        System.out.println("请分别输入以下信息");
        System.out.println("-----------------------------");
        System.out.println("品牌如下：");
        System.out.println("品牌编号\t品牌名");
        System.out.println("1\t\t标致");
        System.out.println("2\t\t大众");
        System.out.println("3\t\t奥迪");
        System.out.println("4\t\t奔驰");
        System.out.println("5\t\t宝马");
        System.out.print("请选择品牌编号：");
        String brandStr=sc.next();
        /*
            用于获取所添加汽车的品牌
         */
        String brand="";
        //用于判断品牌是否存在
        boolean a=true;
        //遍历车辆集合
        for (Car car : CarDao.getCars()) {
            //获取车辆的品牌编号
            String str = car.getBrand().charAt(car.getBrand().indexOf("(") + 1) + "";
            //判断与所输入的品牌编号和集合中的品牌编号是否相同
            if (str.equals(brandStr)){
                //获取品牌
                brand=car.getBrand();
                a=false;
            }
        }
        if (a){
            System.out.println("输入错误");
            addCar();
            return;
        }
        System.out.println("----------------------");
        System.out.println("类型如下：");
        System.out.println("类型编号\t类型名");
        System.out.println("1\t\t紧凑型");
        System.out.println("2\t\t舒适型");
        System.out.println("3\t\tSUV");
        System.out.println("4\t\t精英型");
        System.out.print("请选择类型编号：");
        String typeStr=sc.next();
        /*
            用于获取所添加汽车的类型
         */
        String type="";
        //用于判断类型是否存在
        a=true;
        //遍历车辆集合
        for (Car car : CarDao.getCars()) {
            //获取车辆的类型编号
            String str = car.getType().charAt(car.getType().indexOf("(") + 1) + "";
            //判断与所输入的类型编号和集合中的类型编号是否相同
            if (str.equals(typeStr)){
                //获取类型
                type=car.getType();
                a=false;
            }
        }
        //类型不存在
        if (a){
            System.out.println("输入错误");
            addCar();
            return;
        }
        System.out.println("--------------------------");
        System.out.print("型号：");
        //输入添加车辆型号
        String name=sc.next();
        System.out.println("--------------------------");
        System.out.print("车牌号：");
        //输入添加车辆车牌号
        String carNumber=sc.next();
        System.out.println("--------------------------");
        System.out.print("概要：");
        //输入添加车辆备注
        String remark=sc.next();
        System.out.println("--------------------------");
        System.out.print("颜色：");
        //输入添加车辆颜色
        String color=sc.next();
        System.out.println("--------------------------");
        System.out.print("价格：");
        //输入添加车辆价格
        int carPrice=sc.nextInt();
        System.out.println("--------------------------");
        System.out.print("每日租金：");
        //输入添加车辆每日租金
        double price=sc.nextDouble();
        System.out.println("--------------------------");
        System.out.println("是否可借(0:可借 1:不可借)");
        //输入添加车辆是否可借
        int rentInt=sc.nextInt();
        boolean rent;
        if (rentInt==0){
            rent=true;
        }else if(rentInt==1){
            rent=false;
        }else{
            System.out.println("输入错误");
            addCar();
            return;
        }
        System.out.println("--------------------------");
        System.out.println("是否上架(0:上架 1:下架)");
        //输入添加车辆是否上架
        int statusInt=sc.nextInt();
        boolean status;
        if (statusInt==0){
            status=true;
        }else if(statusInt==1){
            status=false;
        }else{
            System.out.println("输入错误");
            addCar();
            return;
        }
        //创建新车将数据导入
        Car car=new Car(/*集合最后一个元素的Id+1即是新车Id*/CarDao.getCars().get(CarDao.getCars().size()-1).getId()+1,name,remark,brand,type,price,rent,status,carNumber,carPrice,color);
        //将新车加入车辆集合
        adminImpl.addCar(car);
        //将更改后的集合序列化
        CarDao.setCars();
        System.out.println("添加成功");
        rest();
    }

    /**
     * 修改车辆
     * @param id 需要修改的车辆的id
     */
    @Override
    public void updateCar(String id) {
        Car car=null;
        System.out.println("===================================");
        //遍历车辆集合
        for (Car car1 : CarDao.getCars()) {
            //判断传入id与车辆id是否相同
            if ((car1.getId()+"").equals(id)){
                //打印车辆信息
                System.out.println("编号\t汽车名称\t备注\t\t品牌\t\t类型\t\t\t价格\t\t是否可租");
                car=car1;
                System.out.println(car1+"  "+(car1.isRent()?"是":"否"));
            }
        }
        if (car==null){
            System.out.println("车辆不存在");
            rest();
        }
        System.out.println("请输入需要修改的内容的编号：");
        System.out.println("1.租赁价格 2.上架下架");
        //或许需要修改的选项
        int choice=sc.nextInt();
        switch (choice){
            case 1:
                System.out.println("请输入新的租赁价格：");
                double price=sc.nextDouble();
                //调用修改车辆方法  创入需要修改的车辆和需要修改的属性
                adminImpl.updateCar(car,price);
                //序列化对象
                CarDao.setCars();
                break;
            case 2:
                System.out.println("请输入是否上架1.上架 2.下架");
                boolean status;
                int choiceIn=sc.nextInt();
                if (choice==1||choice==2){
                    status=choice==1?true:false;
                    adminImpl.updateCar(car,status);
                    //序列化对象
                    CarDao.setCars();
                    System.out.println("修改成功");
                }else{
                    System.out.println("输入错误");
                    updateCar(id);
                    return;
                }
                break;
            default:
                System.out.println("输入错误");
                rest();
                break;
        }
        System.out.println("修改成功");
        rest();
    }

    /**
     * 打印租车记录
     * @param user
     */
    @Override
    public void carRent(User user) {
        //调用方法打印租车记录
        ArrayList<Record> records = userImpl.carRent();
        if (records.size()<2){
            System.out.println("无租车记录");
            rest();
        }else{
            System.out.println("编号\t\t汽车编号\t汽车名称\t\t用户名\t租金总额\t备注\t\t\t品牌\t\t\t类型\t\t\t\t借车时间\t\t\t\t\t还车时间");
            //第一个为空不打印
            for (int i = 1; i < records.size(); i++) {
                System.out.println(records.get(i).adminRecord());
            }
        }
        System.out.println("输入0   退出");
        System.out.println("输入5   查看全部汽车");
        System.out.println("输入6   查看全部租车记录");
        System.out.println("输入7+用户名  查看指定用户租赁记录 ");
        System.out.println("输入8+汽车编号 查看指定汽车租赁记录");

        String chioce=sc.next();
        if (chioce.length()<2){
            switch (chioce) {
                case "0":
                    menu(user);
                    break;
                case "5":
                    showAllCar2(user);
                    break;
                case "6":
                    carRent(user);
                    break;
                default:
                    System.out.println("输入错误");
                    rest();
            }

        }else{
            String[] str = chioce.split("\\+");
            switch (str[0]) {
                case "7":
                    for (int i = 1; i < records.size(); i++) {
                        if (i==1){
                            System.out.println("编号\t\t汽车编号\t汽车名称\t\t用户名\t租金总额\t备注\t\t\t品牌\t\t\t类型\t\t\t\t借车时间\t\t\t\t\t还车时间");

                        }
                        if (records.get(i).getUser().getName().equals(str[1])) {
                            System.out.println(records.get(i).adminRecord());
                        }
                    }
                    break;
                case "8":
                    for (int i = 1; i < records.size(); i++) {
                        if (i==1){
                            System.out.println("编号\t\t汽车编号\t汽车名称\t\t用户名\t租金总额\t备注\t\t\t品牌\t\t\t类型\t\t\t\t借车时间\t\t\t\t\t还车时间");

                        }
                        if ((records.get(i).getCar().getId()+"").equals(str[1])) {
                            System.out.println(records.get(i).adminRecord());
                        }
                    }
                default:
                    System.out.println("输入错误");
                    rest();
                    break;
            }

        }
        rest();
    }

    /**
     * 用于功能完成后返回主菜单
     */
    public void rest() {
        System.out.println("输入任意字符返回上一层");
        String str=sc.next();
        menu(user);
    }
}
